package rubix.view {
	import flash.display.Sprite;
	import rubix.events.InterfaceEvent;
	
	/**
	 * ...
	 * @author DoctorSTaL
	 */
	public class UserInterfaceView extends Sprite {
		protected static const _undoMoveEvent:InterfaceEvent=new InterfaceEvent(InterfaceEvent.UNDO_MOVE);
		protected static const _undoAllEvent:InterfaceEvent=new InterfaceEvent(InterfaceEvent.UNDO_ALL);
		protected static const _unHighlightSideEvent:InterfaceEvent=new InterfaceEvent(InterfaceEvent.HIGHLIGHT_SIDE);
		protected static const _highlightSideEvent:InterfaceEvent=new InterfaceEvent(InterfaceEvent.HIGHLIGHT_SIDE);
		protected static const _rotateSideEvent:InterfaceEvent=new InterfaceEvent(InterfaceEvent.ROTATE_SIDE);
		protected static const _randomMoveEvent:InterfaceEvent=new InterfaceEvent(InterfaceEvent.RANDOM_MOVE);
		
		public function UserInterfaceView() {
			super();
		}
		
		public function init() {
			initButtons();
		}
		
		// Создание кнопочек.
		// Т.к. демо-версия просцениума нас сильно подвела
		// с интерактивностью контента (метод pick у сцены 
		// при разных трансформациях работает на так гладко,
		// как хотелось бы), а времени на разборки с лучами
		// у нас нет, то нам прийдется сделать кнопочный
		// интерфейс для нашего кубика.
		// Вращение по цвету грани. Цвет грани определяется
		// цветом центрального квадрата на грани.
		private function initButtons():void {
			// контейнер
			var interfaceContainer:SmartContainer = new SmartContainer();
			interfaceContainer.vertical = true;
			// Кнопки для вращения по часовой стрелке
			var txt:TextField = TFFactory.createTextField();
			txt.text = "CW:";
			interfaceContainer.addChild(txt);
			var btnContainer:SmartContainer = new SmartContainer();
			var side:Object;
			for each (side in Sides.data){
				btnContainer.addChild(new LabeledBtn(side.label, side.color, side.orientation));
			}
			btnContainer.addEventListener(MouseEvent.CLICK, btnContainerMouseClickHandler);
			interfaceContainer.addChild(btnContainer);
			
			// Кнопки для вращения против часовой стрелки
			var txt2:TextField = TFFactory.createTextField();
			txt2.text = "CCW:";
			interfaceContainer.addChild(txt2);
			var btnContainer2:SmartContainer = new SmartContainer();
			
			for each (side in Sides.data){
				btnContainer2.addChild(new LabeledBtn(side.label, side.color, side.orientation));
			}
			btnContainer2.addEventListener(MouseEvent.CLICK, btnContainer2MouseClickHandler);
			interfaceContainer.addChild(btnContainer2);
			
			// Кнопка для поворота случайной грани куба
			var randomBtn:LabeledBtn = new LabeledBtn("Random move");
			randomBtn.addEventListener(MouseEvent.CLICK, randomBtnClickHandler);
			interfaceContainer.addChild(randomBtn);
			
			// Кнопка для отмены хода
			var undoBtn:LabeledBtn = new LabeledBtn("Undo");
			undoBtn.addEventListener(MouseEvent.CLICK, undoBtnPressHandler);
			interfaceContainer.addChild(undoBtn);
			var undoAllBtn:LabeledBtn = new LabeledBtn("Undo All");
			undoAllBtn.addEventListener(MouseEvent.CLICK, undoAllBtnPressHandler);
			interfaceContainer.addChild(undoAllBtn);
			
			interfaceContainer.addEventListener(MouseEvent.MOUSE_OVER, btnContainerMouseOverHandler);
			interfaceContainer.addEventListener(MouseEvent.MOUSE_OUT, btnContainerMouseOutHandler);
			interfaceContainer.x = interfaceContainer.y = 10;
			addChild(interfaceContainer);
		}
		
		// Обработчики событий интерфейса
		protected function undoAllBtnPressHandler(event:MouseEvent):void {
			dispatchEvent(_undoAllEvent);
		}
		
		protected function undoBtnPressHandler(event:MouseEvent):void {
			dispatchEvent(_undoMoveEvent);
		}
		
		
		protected function randomBtnClickHandler(event:MouseEvent):void {
			dispatchEvent(_randomMoveEvent);
		}
		
		protected function btnContainerMouseOutHandler(event:MouseEvent):void {
			dispatchEvent(_unHighlightSideEvent);
		}
		
		protected function btnContainerMouseOverHandler(event:MouseEvent):void {
			var btn:LabeledBtn = event.target as LabeledBtn;
			if (btn){
				_highlightSideEvent.orientation = btn.userData;
				dispatchEvent(_highlightSideEvent);
			}
		}
		
		private function btnContainerMouseClickHandler(event:MouseEvent):void {
			var btn:LabeledBtn = event.target as LabeledBtn;
			if (btn){
				_rubix.rotate(btn.userData);
			}
		}
		
		private function btnContainer2MouseClickHandler(event:MouseEvent):void {
			var btn:LabeledBtn = event.target as LabeledBtn;
			if (btn){
				_rubix.rotate(btn.userData, -90);
			}
		}
		
	}

}